perm filename XWORD.SAI[PUZ,HPM] blob
sn#152739 filedate 1975-04-01 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00005 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002 BEGIN "XWORD"
C00004 00003 IF I MOD 2=0 THEN
C00007 00004 ELSE
C00010 00005 IF FOUND=FALSE THEN
C00012 ENDMK
C⊗;
BEGIN "XWORD"
REQUIRE "DDSUB.SAI[GRA,HPM]" SOURCE_FILE;
INTEGER SIZE,I,J,K,L,M,N,O,CHN,DICSIZ,DICSTP,CNT,BRK,EOF,FLG;
OUTSTR("PUZZLE SIZE:"); SIZE←CVD(INCHWL);
OUTSTR("NO OF DICTIONARY WORDS:"); DICSIZ←CVD(INCHWL);
OUTSTR("DICTIONARY STEP SIZE:"); DICSTP←CVD(INCHWL);
OUTSTR("CHANNEL "&CVOS(CHN←GDDCHN(-1))&'15&'12);
DDINIT;
SCREEN(-1,-1,SIZE+1,SIZE+1);
DRKEN; RECTAN(-1000,-1000,1000,1000);
LITEN;
FOR K←0 STEP 1 UNTIL SIZE DO
BEGIN
LINE(0,K,SIZE,K);
LINE(K,0,K,SIZE);
END;
DPYUP(CHN);
SHOW(CHN);
BEGIN
INTEGER ARRAY XWRD[1:SIZE,1:SIZE],CHOICE[1:2*SIZE];
STRING ARRAY WORDS[1:DICSIZ];
OPEN(1,"DSK",0,2,0,30,BRK,EOF);
LOOKUP(1,"DICT",FLG);
SETBREAK(1,'12," "&'15&'13&'14,"INS");
FOR K←1 STEP 1 UNTIL DICSIZ DO
FOR L←1 STEP 1 UNTIL DICSTP DO
DO WORDS[K]←INPUT(1,1) UNTIL LENGTH(WORDS[K])=SIZE;
CLOSE(1);
FOR K←1 STEP 1 UNTIL DICSIZ DO OUTSTR(""""&WORDS[K]&""" ");
I←1;
FOR J←1 STEP 1 UNTIL 2*SIZE DO CHOICE[J]←1;
WHILE I≤2*SIZE DO
BEGIN
BOOLEAN FOUND;
J←(I+1)%2;
K←CHOICE[I];
FOUND←FALSE;
IF I MOD 2=0 THEN
BEGIN
WHILE K≤DICSIZ ∧ ¬FOUND DO
BEGIN
L←1;
WHILE L≤J ∧ WORDS[K][L TO L]=XWRD[J,L] DO L←L+1;
IF L>J THEN
BEGIN
BOOLEAN POSSY,FOUNDUM,MATCH;
FOR L←J STEP 1 UNTIL SIZE DO XWRD[J,L]←WORDS[K][L TO L];
comment check on all the partial words;
POSSY←TRUE;
M←J+1;
WHILE M≤SIZE ∧ POSSY DO
BEGIN
comment match each against the dictionary;
N←1;
MATCH←FALSE;
WHILE N≤DICSIZ ∧ ¬MATCH DO
BEGIN
comment look at each of the first J letters;
O←1;
FOUNDUM←TRUE;
WHILE O≤J ∧ FOUNDUM DO
BEGIN
IF XWRD[O,M]≠WORDS[N][O TO O] THEN FOUNDUM←FALSE;
O←O+1;
END;
N←N+1;
MATCH←MATCH ∨ FOUNDUM;
END;
M←M+1;
POSSY←POSSY ∧ MATCH;
END;
IF POSSY THEN
BEGIN
FOUND←TRUE;
CHOICE[I]←K+1;
END
ELSE K←K+1;
END
ELSE K←K+1;
END;
END
ELSE
BEGIN
WHILE K≤DICSIZ ∧ ¬FOUND DO
BEGIN
L←1;
WHILE L<J ∧ WORDS[K][L TO L]=XWRD[L,J] DO L←L+1;
IF L≥J THEN
BEGIN
BOOLEAN POSSY,FOUNDUM,MATCH;
FOR L←J STEP 1 UNTIL SIZE DO XWRD[L,J]←WORDS[K][L TO L];
comment check on all the partial words;
POSSY←TRUE;
M←J;
WHILE M≤SIZE ∧ POSSY DO
BEGIN
comment match each against the dictionary;
N←1;
MATCH←FALSE;
WHILE N≤DICSIZ ∧ ¬MATCH DO
BEGIN
comment look at each of the first J letters;
O←1;
FOUNDUM←TRUE;
WHILE O≤J ∧ FOUNDUM DO
BEGIN
IF XWRD[M,O]≠WORDS[N][O TO O] THEN FOUNDUM←FALSE;
O←O+1;
END;
N←N+1;
MATCH←MATCH ∨ FOUNDUM;
END;
M←M+1;
POSSY←POSSY ∧ MATCH;
END;
IF POSSY THEN
BEGIN
FOUND←TRUE;
CHOICE[I]←K+1;
END
ELSE K←K+1;
END
ELSE K←K+1;
END;
END;
IF FOUND=FALSE THEN
BEGIN
CHOICE[I]←1;
I←I-1;
END
ELSE
BEGIN
DRKEN; RECTAN(-1000,-1000,1000,1000);
LITEN;
FOR K←0 STEP 1 UNTIL SIZE DO
BEGIN
LINE(0,K,SIZE,K);
LINE(K,0,K,SIZE);
END;
FOR K←1 STEP 1 UNTIL SIZE DO
FOR L←1 STEP 1 UNTIL (I+1)%2 DO
BEGIN
TXTPOS(K-.7,SIZE-L+.3,.5,.5);
TEXT(XWRD[K,L]);
END;
FOR K←1 STEP 1 UNTIL I%2 DO
FOR L←1 STEP 1 UNTIL SIZE DO
BEGIN
TXTPOS(K-.7,SIZE-L+.3,.5,.5);
TEXT(XWRD[K,L]);
END;
DPYUP(CHN);
SHOW(CHN);
I←I+1;
END;
END;
END;
END;